package network.t_04_rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

/**
 * https://www.liaoxuefeng.com/wiki/1252599548343744/1323711850348577
 * Java 的 RMI 严重依赖序列化和反序列化，而这种情况下可能会造成严重的安全漏洞，因为 Java 的序列化和反序列化不但涉及到数据，
 * 还涉及到二进制的字节码，即使使用白名单机制也很难保证 100% 排除恶意构造的字节码。
 * 因此，使用 RMI 时，双方必须是内网互相信任的机器，不要把端口暴露在公网上作为对外服务。
 * 此外，Java 的 RMI 调用机制决定了双方必须是 Java 程序，其它语言很难调用 Java 的 RMI。
 * 如果要使用不同语言进行 RPC 调用，可以选择更通用的协议，例如 gRPC。
 */
public class RMIServer {
    public static void main(String[] args) throws RemoteException {
        System.out.println("create World clock remote service...");
        // 实例化一个 WorldClock:
        WorldClock worldClock = new WorldClockService();
        // 将此服务转换为远程服务接口:
        Remote skeleton = UnicastRemoteObject.exportObject(worldClock, 0);
        // 将 RMI 服务注册到 6666 端口:
        Registry registry = LocateRegistry.createRegistry(6666);
        // 注册此服务，服务名为 WorldClock
        registry.rebind("WorldClock", skeleton);
    }
}
